/*
 * TCA6416A.c
 *
 *  Created on: 2013-4-6
 *      Author: Administrator
 */
#include "USCI_I2C.h"

//-----ƼĴ-----
#define		In_CMD0			0x00	//ȡܽ״̬Ĵֻ
#define		In_CMD1			0x01
#define		Out_CMD0		0x02	//ƹܽ״̬ĴR/W
#define		Out_CMD1		0x03
#define		PIVS_CMD0		0x04	//ƹܽ״̬ĴR/W
#define		PIVS_CMD1		0x05
#define		CFG_CMD0		0x06	//ܽŷƣ1In0:Out
#define		CFG_CMD1		0x07
volatile unsigned int TCA6416A_InputBuffer=0;

/******************************************************************************************************
 *        ƣTCA6416_Tx_Frame()
 *        ܣTCA6416һ֡
 * ڲ*p_Txݵͷָ
 * 					 numֽ
 * ڲ
 * ˵       õײʵ֡ɹΪֹ
 *        
 ******************************************************************************************************/
void TCA6416_Tx_Frame(unsigned char *p_Tx,unsigned char num)
{
	unsigned char temp=0;
	do{
			temp=PreSet_Tx_Frame(p_Tx, num);
		}while(temp==0);
}
/******************************************************************************************************
 *        ƣTCA6416_Rx_Frame()
 *        ܣTCA6416Aһ֡
 * ڲ *p_Rxݵͷָ
 * 					 numֽ
 * ڲ
 * ˵       õײʵ֡ճɹΪֹ
 *        
 ******************************************************************************************************/
void TCA6416_Rx_Frame(unsigned char *p_Rx,unsigned char num)
{
	unsigned char temp=0;
	do {
		temp=PreSet_Rx_Frame(p_Rx, num);
	}while(temp==0);
}
/******************************************************************************************************
 *        ƣTCA6416A_Init()
 *        ܣTCA6416A
 * ڲ
 * ڲ
 * ˵       ƶFIFOָѭ
 *        
 ******************************************************************************************************/
void TCA6416A_Init(void)
{
	unsigned char conf[2]={0};
	 __delay_cycles(100000);			//TCA6416ĸλʱȵƬӳȷɿλ
	 I2C_Init();
	 I2C_Tx_Init();						//ԶĬϷģʽ
	//----չʹãڹܽųʼΪ룬ܽųʼΪ

	conf[0] = CFG_CMD0;					//TCA6416ƼĴ
	conf[1] = 0x00;						//  0 0 0 0_0 0 0 0  LED0~LED7
	TCA6416_Tx_Frame(conf,2);			//  д

	conf[0] = CFG_CMD1;
	conf[1] = 0x0f;						//  0 0 0 0_1 1 1 1 ()
	TCA6416_Tx_Frame(conf,2);			//  д

	//----ϵȽܽΪߣ˲ܽЧ
	conf[0] = Out_CMD0;
	conf[1] = 0xff;						// ĳλ1Ϊߣ0Ϊ
	TCA6416_Tx_Frame(conf,2);			//  д

	conf[0] = Out_CMD1;
	conf[1] = 0xff;
	TCA6416_Tx_Frame(conf,2);			//  д
}
/******************************************************************************************************
 *        ƣPinOUT()
 *        ܣI2CRx¼ȡUCB0RXBUFдָ
 * ڲ
 * ڲ
 * ˵       ƶFIFOָѭ
 *        
 ******************************************************************************************************/
void PinOUT(unsigned char pin,unsigned char status)
{
	static unsigned char pinW0 = 0xff;		//ڻдӦܽŵ״̬Ϣ˲TCA6416AеǰĴֵ
	static unsigned char pinW1 = 0xff;		//ڻдӦܽŵ״̬Ϣ˲TCA6416AеǰĴֵ

	unsigned char out0_7[2]={0};				//ܽ pin0~pin7״̬
	unsigned char out10_17[2] = {0};			//ܽ pin10~pin17״̬
	if(pin<=7)												//ѡܽΪpin0~pin7 ˢҪpinW0 ״̬
	{
		if(status == 0)
			pinW0 &= ~(1<<pin);
		else
			pinW0 |= 1<<pin;
		out0_7[0] = Out_CMD0;
		out0_7[1] = pinW0;
		 TCA6416_Tx_Frame(out0_7,2);					// ºݰдоƬĴ

	}
	else if(pin>=10 && pin<=17)				//ѡܽΪpin10~pin17 ˢҪpinW1 ״̬
	{
		if(status == 0)
			pinW1 &= ~(1<<(pin%10));
		else
			pinW1 |= 1<<(pin%10);
		out10_17[0] = Out_CMD1;
		out10_17[1] = pinW1 ;
		 TCA6416_Tx_Frame(out10_17,2);				// ºݰдоƬĴ
	}
	else
	{
	    __no_operation();                       					// Set breakpoint >>here<<
	}

}
/******************************************************************************************************
 *        ƣPinIN()
 *        ܣI2CRx¼ȡUCB0RXBUFдָ
 * ڲ
 * ڲ
 * ˵       ƶFIFOָѭ
 *        
 ******************************************************************************************************/
void PinIN()
{
	unsigned char temp[1]={0};
	unsigned char conf[1]={0};
	conf[0]=In_CMD1;
	TCA6416_Tx_Frame(conf,1);										//	дҪȡļĴַ
	USCI_I2C_Rx_Init();                 		 								// I2CлRxģʽ ʼ
	TCA6416_Rx_Frame(temp,1);										// ȡڹܽϢ

	//----¼ֵµ뻺----
    TCA6416A_InputBuffer = TCA6416A_InputBuffer&0x00ff;
	TCA6416A_InputBuffer |=(((unsigned int)temp[0])<<8 )&0xff00;
	USCI_I2C_Tx_Init();
}
